#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CATEGORY_LEN 100
#define MAX_NAME_LEN 100
#define MAX_PARTS 100
// 命令常量
enum {
    CMD_QUIT,   // 退出
    CMD_READ,   // 读取
    CMD_SAVE,   // 保存
    CMD_PRINT,  // 打印
    CMD_QUERY,  // 查询
    CMD_INSERT, // 添加
    CMD_UPDATE, // 修改
    CMD_DELETE, // 删除
    CMD_SORT,   // 排序
    CMD_CHART,  // 图表
};

// 函数声明
void init(void);         // 程序启动
void quit(void);         // 程序退出
void display_menu(void); // 显示命令菜单
int make_choice(void);   // 选择命令
int confirm(const char* msg);

void read_data(void);    // 读取
void save_data(void);    // 保存
void print_data(void);   // 打印
void query_data(void);   // 查询
void add_data(void);     // 添加
void update_data(void);  // 修改
void delete_data(void);  // 删除
void sort_data(void);    // 排序
void make_chart(void);   // 图表

// 主程序
int main(void)
{
    init();
    for (;;) {
        display_menu();
        int c = make_choice();
        switch (c) {
        case CMD_READ:
            read_data();
            break;
        case CMD_SAVE:
            save_data();
            break;
        case CMD_PRINT:
            print_data();
            break;
        case CMD_QUERY:
            query_data();
            break;
        case CMD_INSERT:
            add_data();
            break;
        case CMD_UPDATE:
            update_data();
            break;
        case CMD_DELETE:
            delete_data();
            break;
        case CMD_SORT:
            sort_data();
            break;
        case CMD_CHART:
            make_chart();
            break;
        case CMD_QUIT:
            if (confirm("确定要退出吗？")) quit();
            break;
        default:
            printf("命令错误，请重新选择\n");
        }
    }
    return 0;
}

void init(void)
{
    puts("库存管理系统启动");
}

void quit(void)
{
    puts("程序退出");
    exit(EXIT_SUCCESS);
}

void display_menu(void)
{
    printf("\n%d 读取 | %d 保存 | %d 打印 | %d 查询 | %d 添加\n"
           "%d 修改 | %d 删除 | %d 排序 | %d 图表 | %d 退出\n\n",
        CMD_READ, CMD_SAVE, CMD_PRINT, CMD_QUERY, CMD_INSERT,
        CMD_UPDATE, CMD_DELETE, CMD_SORT, CMD_CHART, CMD_QUIT);
}

int make_choice(void)
{
    int choice;
    int ok = 0;

    while (!ok) {
        printf("请选择：");
        ok = scanf("%d", &choice);
        scanf("%*[^\n]");
    }

    return choice;
}

int confirm(const char* msg)
{
    char c = 'n';
    printf("%s(Y/N): ", msg);
    scanf(" %c%*[^\n]", &c);
    return c == 'y' || c == 'Y';
}

// 零件库存储结构
#define NAME_LEN 31
#define MAX_PARTS 100

struct part {
    int number;
    char name[NAME_LEN + 1];
    int on_hand;
};

static struct part inventory[MAX_PARTS];
static int num_parts = 0;


int find_part(int part_number)
{
    for (int i = 0; i < num_parts; i++)
        if (inventory[i].number == part_number)
            return i;

    return -1; // not found
}

void query_data(void)
{
    puts("查询");
}

void add_data(void)
{
    puts("添加");
}

void swap_parts(struct part *a, struct part *b) {
    struct part temp = *a;
    *a = *b;
    *b = temp;
}
void update_data(void)
{
    int part_number;
    // Step 1: 输入零件编号
    printf("Step 1: 请输入要修改的零件编号: ");
    scanf("%d", &part_number);
    scanf("%*[^\n]");  // 清除输入缓冲区剩余内容

    // Step 2: 检查零件是否存在
    int index = find_part(part_number);
    if (index == -1) {
        printf("Step 2: 零件不存在，无法修改\n");
        return;
    }

    // Step 3: 输入零件名称和库存数量
    printf("Step 3: 请输入新的零件名称: ");
    fgets(inventory[index].name, NAME_LEN + 1, stdin);
    // 去除 fgets 可能带入的换行符
    inventory[index].name[strcspn(inventory[index].name, "\n")] = '\0';

    printf("Step 3: 请输入新的库存数量: ");
    scanf("%d", &inventory[index].on_hand);
    scanf("%*[^\n]");  // 清除输入缓冲区剩余内容

    // Step 4: 更新零件数据（已通过上面的赋值完成）
    // Step 5: 提示更新成功
    printf("Step 5: 零件数据更新成功\n");
}

void delete_data(void)
{
    puts("删除");
}

void read_data(void)
{
    puts("读取");
}

void save_data(void)
{
    puts("保存");
}

void print_data(void)
{
    puts("打印");
}

void sort_data(void)
{
    if (num_parts <= 1) {
        printf("零件数量不足，无需排序\n");
        return;
    }

    int swapped;
    for (int i = 0; i < num_parts - 1; i++) {
        swapped = 0;
        for (int j = 0; j < num_parts - i - 1; j++) {
            if (inventory[j].number > inventory[j + 1].number) {
                swap_parts(&inventory[j], &inventory[j + 1]);
                swapped = 1;
            }
        }
        if (!swapped) break;
    }

    printf("零件已按编号升序排序\n");
}

void make_chart(void) {
    // 初始化库存数据
    Item items[] = {
        {101, "电脑", 20},
        {102, "打印机", 10},
        {103, "显示器", 8},
        {104, "手机", 12}
    };
    int item_count = sizeof(items) / sizeof(items[0]);

    // 输出图表标题
    printf("==== 库存数量图表 ====\n");
    printf("物品ID  物品名称  库存数量  图表表示\n");
    printf("------------------------------------\n");

    // 为每个物品生成图表
    for (int i = 0; i < item_count; i++) {
        printf("%-8d %-8s %-10d ", 
               items[i].id, 
               items[i].name, 
               items[i].quantity);
        
        // 生成星号图表
        for (int j = 0; j < items[i].quantity; j++) {
            printf("*");
        }
        
        // 显示具体数量
        printf(" (%d)\n", items[i].quantity);
    }
}
void add_data(void) {
    if (part_count >= MAX_PARTS) {
        printf("库存已满，无法添加新零件\n");
        return;
    }
    
    Part new_part;
    
    printf("输入零件ID: ");
    scanf("%d", &new_part.id);
    clear_input_buffer();
    
    // 检查ID是否已存在
    if (find_part(new_part.id) != -1) {
        printf("错误：ID %d 已存在\n", new_part.id);
        return;
    }
    
    printf("输入零件名称: ");
    fgets(new_part.name, MAX_NAME_LEN, stdin);
    new_part.name[strcspn(new_part.name, "\n")] = '\0';
    
    printf("输入零件类别: ");
    fgets(new_part.category, MAX_CATEGORY_LEN, stdin);
    new_part.category[strcspn(new_part.category, "\n")] = '\0';
    
    printf("输入库存数量: ");
    scanf("%d", &new_part.quantity);
    
    printf("输入单价: ");
    scanf("%lf", &new_part.price);
    
    printf("输入补货水平: ");
    scanf("%d", &new_part.reorder_level);
    clear_input_buffer();
    
    inventory[part_count++] = new_part;
    printf("零件添加成功！\n");
}
